iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

學習 Android Kotlin 隨筆系列 第 13

[ Day 13 ] 是 RecyclerView 清單啊!(二)實作 TODO-List

  • 分享至 

  • xImage
  •  

| 實作 code

  • 連結 | Android 專案
    • @commit 4ea484b

| RecyclerView

  • TODO LIST

| 前言概念

  • 實作出能夠新增圖片的 TODO-LIST,要能夠存取到系統裡面的相簿,要能夠接取使用者回傳的圖片,還要能夠放入 recyclerView 裡面。麻煩的部分可能是接取圖片以及將它們放入 recyclerView,這邊要寫一個 data-class ,為得是將文字以及圖片都能夠一併回傳給 list 的 fragment

| 實作概念

  • 存取系統的相簿

    這邊要記得加入 EXTRA_ALLOW_MULTIPLE 這個屬性,才有辦法選取系統的多張照片,否則只能夠選擇一張

    private fun choosePhotoEvent(){
        val intentAlbum = Intent(Intent.ACTION_PICK)
        intentAlbum.type = "image/*"
        intentAlbum.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        startActivityForResult(intentAlbum,ALBUM_CODE)
    }
    
  • 接收被選取的照片

    這邊要在 onActivityResult 裡面接收,這邊會接收上個 Activity 結束之後,回傳回來的資料。因為選擇本地相簿會跳到一個 Activity 去,當使用者結束之後會再回來,進入這個 onActivityResult
    裡面的 ALBUM_CODE 是一個參數,透過這個參數能夠去確認是否是來自相簿 Activity 的,而透過 data?.clipData?.getItemAt(i)?.uri 能夠得到使用者到底選了哪幾張圖片。

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
       super.onActivityResult(requestCode, resultCode, data)
       when(requestCode) {
           ALBUM_CODE -> {
               if (resultCode == Activity.RESULT_OK && data != null) {
                   val args = Bundle()
                   for(i in 0..(data.clipData!!.itemCount-1)){
                       noteList.add(Holder.Datas(data?.clipData?.getItemAt(i)?.uri, "hi"))
                   }
                   args.putParcelableArrayList(NEW_IMG ,ArrayList<Holder.Datas>(noteList))
                   val todoList = fragmentManager!!.findFragmentByTag("todoList")
                   todoList!!.arguments = args
                   fragmentManager?.popBackStack()
               }
           }
       }
    }
    
  • 塞回 recyclerView 裡面

    我這邊是先把他們包成一個 ArrayList 回傳回去,再去取 ArrayList 裡面的每個 data-class,放入 recyclerView。透過 putParcelableArrayList<Holder.Datas> 放入 bundle 的方法,將資料塞入 fragment 裡面去。

| 實作小泥坑

  • 怎麼讓使用者一次選取多張圖片?

    如上面所說的,加入EXTRA_ALLOW_MULTIPLE 這個屬性即可。

  • 為何圖片的載入那麼花時間?

    因為原圖可能解析度很高,而這樣的圖片大小也會顯得相當的大,會導致整個 app 的負載量很高。這時使用 google 提出的 Glide,他是去模仿照片用畫的畫出圖來,可以用來解決把整張原圖載入的瓶頸。使用方法如下

    // localPhoto: ImageView
    // newList.imgURL: URL
    
    Glide.with(view).load(newList.imgURL).into(localPhoto)
    

上一篇
[ Day 12 ] 是 RecyclerView 清單啊!(一)實作 TODO-List
下一篇
[ Day 14 ] 是 RecyclerView 清單啊!(三)實作 聊天室介面
系列文
學習 Android Kotlin 隨筆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言